package com.edu.exam.entity.assessment;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 组卷方案配置实体类
 * 所属模块：B-03 试卷管理模块
 * 对应数据库表：grouping_scheme_config
 *
 * <p>组卷方案配置表用于存储组卷方案的详细配置信息，支持知识点配置、难度配置、题型配置等多种配置类型。
 * 通过类型-键-值的三元组结构，实现配置的结构化管理和灵活扩展。</p>
 *
 * <p>支持的配置类型包括：
 * - KNOWLEDGE_POINT: 知识点配置，配置组卷涉及的知识点范围和权重
 * - DIFFICULTY: 难度配置，配置试题难度分布和难度系数
 * - QUESTION_TYPE: 题型配置，配置试题类型分布和各种题型的数量
 * - SCORE: 分值配置，配置各题型分值和总分分配
 * - TIME: 时间配置，配置考试时间和各题型时间分配
 * - QUANTITY: 数量配置，配置各题型试题数量</p>
 *
 * @author 系统生成
 * @version 2.0
 * @since 2025-11-09
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class GroupingSchemeConfig {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 方案ID
     *
     * <p>关联组卷方案主表的ID，建立配置与方案的关联关系。
     * 必须在数据库中存在有效的组卷方案记录。</p>
     */
    @Column(name = "scheme_id", nullable = false)
    private Long schemeId;

    /**
     * 配置类型
     *
     * <p>配置项的分类标识，用于对配置进行分组管理。
     * 支持以下配置类型：
     * - KNOWLEDGE_POINT: 知识点配置
     * - DIFFICULTY: 难度配置
     * - QUESTION_TYPE: 题型配置
     * - SCORE: 分值配置
     * - TIME: 时间配置
     * - QUANTITY: 数量配置</p>
     */
    @Column(name = "config_type", nullable = false, length = 50)
    private String configType;

    /**
     * 配置键
     *
     * <p>配置项的标识名称，用于唯一标识同一配置类型下的具体配置项。
     * 例如：在QUESTION_TYPE类型下，可以有"选择题"、"填空题"、"简答题"等不同的配置键。</p>
     */
    @Column(name = "config_key", nullable = false, length = 100)
    private String configKey;

    /**
     * 配置值
     *
     * <p>配置项的具体值，支持JSON格式的复杂配置。
     * 可以是简单的数值，也可以是复杂的JSON对象，如权重分配、数量限制等。</p>
     */
    @Column(name = "config_value", nullable = false, columnDefinition = "TEXT")
    private String configValue;

    /**
     * 排序顺序
     *
     * <p>配置项在同类型下的显示顺序，用于界面展示和排序。
     * 数值越小，排序越靠前。相同排序时按配置键字母顺序排序。</p>
     */
    @Column(name = "sort_order", nullable = false)
    private Integer sortOrder = 0;

    /**
     * 是否必需
     *
     * <p>标识该配置项是否为必填项。
     * true表示必填，false表示可选。必填项在方案验证时必须提供有效值。</p>
     */
    @Column(name = "is_required", nullable = false)
    private Boolean isRequired = true;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "created_time", nullable = false, updatable = false)
    private LocalDateTime createdTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "updated_time", nullable = false)
    private LocalDateTime updatedTime;

    /**
     * 创建人
     */
    @Column(name = "created_by", length = 50)
    private String createdBy;

    /**
     * 更新人
     */
    @Column(name = "updated_by", length = 50)
    private String updatedBy;
}